<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>升降式双旋翼飞行器 | 啊粥啊周舟の部落阁</title><meta name="author" content="Zhouwy"><meta name="copyright" content="Zhouwy"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="2018年湖南省大学生电子设计竞赛设计—— 升降式双旋翼飞行器1、赛题简介1.1、赛题任务设计并制作一个沿竖杆升降的双旋翼飞行器及其控制系统。竖杆采用φ 12mm的圆钢，外套φ 17mm不锈钢管，长(1.4~1.7)m, 下端固定在底座上，杆上分别标有明显的A、B、C、D点标记，其中: A点距底面30cm, B点距底面70cm, C点距底面100cm，D点距底面130cm，且CD段有cm间隔的标记">
<meta property="og:type" content="article">
<meta property="og:title" content="升降式双旋翼飞行器">
<meta property="og:url" content="https://gitee.com/zwyywz/zwyywz.git/2019/09/07/%E5%8F%8C%E6%97%8B%E7%BF%BC%E9%A3%9E%E8%A1%8C%E5%99%A8/index.html">
<meta property="og:site_name" content="啊粥啊周舟の部落阁">
<meta property="og:description" content="2018年湖南省大学生电子设计竞赛设计—— 升降式双旋翼飞行器1、赛题简介1.1、赛题任务设计并制作一个沿竖杆升降的双旋翼飞行器及其控制系统。竖杆采用φ 12mm的圆钢，外套φ 17mm不锈钢管，长(1.4~1.7)m, 下端固定在底座上，杆上分别标有明显的A、B、C、D点标记，其中: A点距底面30cm, B点距底面70cm, C点距底面100cm，D点距底面130cm，且CD段有cm间隔的标记">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/%E4%B8%8B%E8%BD%BD.jpg">
<meta property="article:published_time" content="2019-09-07T01:25:00.000Z">
<meta property="article:modified_time" content="2023-04-16T13:03:23.121Z">
<meta property="article:author" content="Zhouwy">
<meta property="article:tag" content="智能控制">
<meta property="article:tag" content="STM32">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/%E4%B8%8B%E8%BD%BD.jpg"><link rel="shortcut icon" href="/zwyywz/img/favicon.png"><link rel="canonical" href="https://gitee.com/zwyywz/zwyywz.git/2019/09/07/%E5%8F%8C%E6%97%8B%E7%BF%BC%E9%A3%9E%E8%A1%8C%E5%99%A8/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/zwyywz/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/zwyywz/',
  algolia: undefined,
  localSearch: undefined,
  translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"簡"},
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":300},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: true,
    post: true
  },
  runtime: '',
  dateSuffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: {"limitCount":50,"languages":{"author":"作者: Zhouwy","link":"链接: ","source":"来源: 啊粥啊周舟の部落阁","info":"著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。"}},
  lightbox: 'fancybox',
  Snackbar: undefined,
  source: {
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isAnchor: false,
  percent: {
    toc: true,
    rightside: true,
  }
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: '升降式双旋翼飞行器',
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isToc: true,
  postUpdate: '2023-04-16 21:03:23'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
    win.getCSS = (url,id = false) => new Promise((resolve, reject) => {
      const link = document.createElement('link')
      link.rel = 'stylesheet'
      link.href = url
      if (id) link.id = id
      link.onerror = reject
      link.onload = link.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        link.onload = link.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(link)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    
    const detectApple = () => {
      if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
        document.documentElement.classList.add('apple')
      }
    }
    detectApple()
    })(window)</script><link rel="stylesheet" href="///at.alicdn.com/t/c/font_4018630_wl3l75i04vl.css"><meta name="generator" content="Hexo 6.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/zwyywz/img/avatar.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/zwyywz/archives/"><div class="headline">文章</div><div class="length-num">17</div></a><a href="/zwyywz/tags/"><div class="headline">标签</div><div class="length-num">29</div></a><a href="/zwyywz/categories/"><div class="headline">分类</div><div class="length-num">5</div></a></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/zwyywz/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/zwyywz/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/zwyywz/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 分类</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/zwyywz/note/"><i class="fa-fw iconfont icon-xuexibiji"></i><span> 学习笔记</span></a></li><li><a class="site-page child" href="/zwyywz/opensource/"><i class="fa-fw iconfont icon-xiangmu"></i><span> 开源项目</span></a></li><li><a class="site-page child" href="/zwyywz/development/"><i class="fa-fw iconfont icon-peizhi-xitongpeizhi"></i><span> 环境配置</span></a></li></ul></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/zwyywz/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/zwyywz/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/zwyywz/link/"><i class="fa-fw fas fa-link"></i><span> 链接</span></a></div><div class="menus_item"><a class="site-page" href="/zwyywz/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="post-bg" id="page-header" style="background-image: url('https://blog-1300216920.cos.ap-nanjing.myqcloud.com/下载.jpg')"><nav id="nav"><span id="blog-info"><a href="/zwyywz/" title="啊粥啊周舟の部落阁"><span class="site-name">啊粥啊周舟の部落阁</span></a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/zwyywz/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/zwyywz/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/zwyywz/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 分类</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/zwyywz/note/"><i class="fa-fw iconfont icon-xuexibiji"></i><span> 学习笔记</span></a></li><li><a class="site-page child" href="/zwyywz/opensource/"><i class="fa-fw iconfont icon-xiangmu"></i><span> 开源项目</span></a></li><li><a class="site-page child" href="/zwyywz/development/"><i class="fa-fw iconfont icon-peizhi-xitongpeizhi"></i><span> 环境配置</span></a></li></ul></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/zwyywz/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/zwyywz/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/zwyywz/link/"><i class="fa-fw fas fa-link"></i><span> 链接</span></a></div><div class="menus_item"><a class="site-page" href="/zwyywz/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="post-info"><h1 class="post-title">升降式双旋翼飞行器</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2019-09-07T01:25:00.000Z" title="发表于 2019-09-07 09:25:00">2019-09-07</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2023-04-16T13:03:23.121Z" title="更新于 2023-04-16 21:03:23">2023-04-16</time></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-pv-cv" id="" data-flag-title="升降式双旋翼飞行器"><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">阅读量:</span><span id="busuanzi_value_page_pv"><i class="fa-solid fa-spinner fa-spin"></i></span></span></div></div></div></header><main class="layout" id="content-inner"><div id="post"><article class="post-content" id="article-container"><p>2018年湖南省大学生电子设计竞赛设计——</p>
<h1 id="升降式双旋翼飞行器"><a href="#升降式双旋翼飞行器" class="headerlink" title="升降式双旋翼飞行器"></a><strong>升降式双旋翼飞行器</strong></h1><h2 id="1、赛题简介"><a href="#1、赛题简介" class="headerlink" title="1、赛题简介"></a>1、赛题简介</h2><h3 id="1-1、赛题任务"><a href="#1-1、赛题任务" class="headerlink" title="1.1、赛题任务"></a>1.1、赛题任务</h3><p>设计并制作一个沿竖杆升降的双旋翼飞行器及其控制系统。竖杆采用φ 12mm的圆钢，外套φ 17mm不锈钢管，长(1.4~1.7)m, 下端固定在底座上，杆上分别标有明显的A、B、C、D点标记，其中: A点距底面30cm, B点距底面70cm, C点距底面100cm，D点距底面130cm，且CD段有cm间隔的标记，如图1所示。双旋翼飞行器由根横板 和安装在横板两端的直流电机、螺旋浆组成，横板长度为50cm，中心最宽处宽度为10cm，两直流电机轴间距离为40cm,且横板中部有一个圆孔( φ20)。竖杆穿过横板中部的圆孔，能使横板沿竖杆自由地上下移动，如图2所示。控制系统通过控制两个螺旋浆的转速实现双旋翼飞行器起飞、降落以及飞行过程中的高度控制。在飞行器上有两个LED灯指示飞行器的状态。其中白色发光二极管为1#指示灯，红色发光二极管为2#指示灯。横板上离中心5cm处需要安装- - 个悬挂法码的小钩。</p>
<h3 id="1-2、基本要求"><a href="#1-2、基本要求" class="headerlink" title="1.2、基本要求"></a>1.2、基本要求</h3><p>当飞行器静止地停在底面时，键启动控制系统， 分别完成以下飞行过程:</p>
<p>(1)在15秒内，飞行器由地面上升且高度超过A点3秒以上，再平稳地降落回地面:</p>
<p>(2)在 20秒内，飞行器由地面上升并悬停在CD段维持3秒以上，再平稳地降落回地面:</p>
<p>(3) 在30秒内，飞行器由地面上升并悬停在AB段维持3秒，再上升并悬停在CD段维持3秒，再平稳地降落回地面:在此过程中，飞行器悬停在AB段时亮1“灯，在CD段悬停时亮2*灯，其它不亮灯。</p>
<p> (4) 在30秒内，飞行器由地面上升并悬停在CD段内的指定高度(X)5秒以上，且高度误差不超过Scm (以上下波动中心为准)、上下波动范围不超过5cm, 达到要求时同时亮1”、2*灯;</p>
<p>(5) 将控制系统、电池等全部安装在横板上，完成基本部分所有要求，且飞行器不出现螺旋状态。</p>
<h3 id="1-3、发挥部分"><a href="#1-3、发挥部分" class="headerlink" title="1.3、发挥部分"></a>1.3、发挥部分</h3><p>控制系统、电池等全部安装在横板上的条件下:</p>
<p>(1) 飞行器由地面上升并悬停在CD段内的指定高度(X) 5秒以上时，人为将飞行器拉到BC段，飞行器能够自动返回原先的高度;</p>
<p>(2)在基本部分(4) 的基础上，进一步提高控制精度， 实现飞行器高度误差不超过3cm、上下波动范围不超过3cm,误差及波动范围越小越好;</p>
<p> (3)在完成发挥部分(2) 的基础上，实现飞行器高度的增量控制，即:通过按步进值键X)，使飞行器上升Xcm、 或按另一个键使飞行器下降Xcm, 误差、波动范围要求同发挥部分(2)</p>
<p>(4)在飞行器中间小钩上加挂10克以上重物，完成发挥部分(3)</p>
<p>(5)自由发挥(仅限于更复杂的飞行路径和提高定位精度)</p>
<h2 id="2、原理论证"><a href="#2、原理论证" class="headerlink" title="2、原理论证"></a>2、原理论证</h2><blockquote>
<p>PID 控制器以各种形式使用超过了 1 世纪，广泛应用在机械设备、气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一，是当之无愧的万能算法。</p>
</blockquote>
<p>PID 实指“比例 proportional”、“积分 integral”、“微分 derivative”，这三项构 成 PID 基本要素。每一项完成不同任务，对系统功能产生不同的影响。它的结构简单，参数易 于调整，是控制系统中经常采用的控制算法。</p>
<p><strong>u(t)</strong>为控制器输出的控制量；（输出）</p>
<p><strong>e(t)</strong>为偏差信号，它等于给定量与输出量之差；（输入）</p>
<p><strong>KP</strong> 为比例系数；（对应参数 P）</p>
<p><strong>TI</strong> 为积分时间常数；（对应参数I）</p>
<p><strong>TD</strong> 为微分时间常数。(对应参数 D) </p>
<p>数字 PID 控制算法通常分为位置式 PID 控制算法和增量式 PID 控制算法。  </p>
<p><strong>位置式 PID 算法 :</strong></p>
<p> e(k): 用户设定的值（目标值） -  控制对象的当前的状态值 </p>
<p>比例P :    e(k)</p>
<p>积分I :   ∑e(i)     误差的累加</p>
<p>微分D :  e(k) - e(k-1)  这次误差-上次误差</p>
<p>也就是位置式PID是当前系统的实际位置，与你想要达到的预期位置的偏差，进行PID控制</p>
<p>因为有误差积分 ∑e(i)，一直累加，也就是当前的输出u(k)与过去的所有状态都有关系，用到了误差的累加值；（误差e会有误差累加），输出的u(k)对应的是执行机构的实际位置，，一旦控制输出出错(控制对象的当前的状态值出现问题 )，u(k)的大幅变化会引起系统的大幅变化</p>
<p>并且位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积，一旦误差开始反向变化，系统需要一定时间从饱和区退出，所以在u(k)达到最大和最小时，要停止积分作用，并且要有积分限幅和输出限幅。</p>
<p><strong>增量式PID：</strong></p>
<p>比例P :    e(k)-e(k-1)   这次误差-上次误差</p>
<p>积分I :   e(i)     误差   </p>
<p>微分D :  e(k) - 2e(k-1)+e(k-2)   这次误差-2*上次误差+上上次误差</p>
<p> 增量式PID根据公式可以很好地看出，一旦确定了 KP、TI  、TD，只要使用前后三次测量值的偏差， 即可由公式求出控制增量</p>
<p>而得出的控制量▲u(k)对应的是近几次位置误差的增量，而不是对应与实际位置的偏差     没有误差累加</p>
<p>也就是说，增量式PID中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关，容易通过加权处理获得比较好的控制效果，并且在系统发生问题时，增量式不会严重影响系统的工作</p>
<p><strong>总结：增量型 PID，是对位置型 PID 取增量，这时控制器输出的是相邻两次采样时刻所计算的位置值</strong><br><strong>之差，得到的结果是增量，即在上一次的控制量的基础上需要增加（负值意味减少）控制量。</strong></p>
<p><code>***增量式与位置式区别：***</code><br>1增量式算法不需要做累加，控制量增量的确定仅与最近几次偏差采样值有关，计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值，容易产生较大的累加误差。 </p>
<p>2增量式算法得出的是控制量的增量，例如在阀门控制中，只输出阀门开度的变化部分，误动作 影响小，必要时还可通过逻辑判断限制或禁止本次输出，不会严重影响系统的工作。 而位置式的输出直接对应对象的输出，因此对系统影响较大。</p>
<p>3增量式PID控制输出的是控制量增量，并无积分作用，因此该方法适用于执行机构带积分部件的对象，如步进电机等，而位置式PID适用于执行机构不带积分部件的对象，如电液伺服阀。</p>
<p>4在进行PID控制时，位置式PID需要有积分限幅和输出限幅，而增量式PID只需输出限幅</p>
<p>位置式PID优缺点：<br>优点：<br>①位置式PID是一种非递推式算法，可直接控制执行机构（如平衡小车），u(k)的值和执行机构的实际位置（如小车当前角度）是一一对应的，因此在执行机构不带积分部件的对象中可以很好应用</p>
<p>缺点：<br>①每次输出均与过去的状态有关，计算时要对e(k)进行累加，运算工作量大。</p>
<p>增量式PID优缺点：<br>优点：<br>①误动作时影响小，必要时可用逻辑判断的方法去掉出错数据。<br>②手动/自动切换时冲击小，便于实现无扰动切换。当计算机故障时，仍能保持原值。<br>③算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关。</p>
<p>缺点：<br>①积分截断效应大，有稳态误差；</p>
<p>②溢出的影响大。有的被控对象用增量式则不太好；</p>
<p>PID算法C语言实现</p>
<p>首先，定义一个结构变量，用以存放PID运算中所需要的数据。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> _<span class="title">pid</span>&#123;</span></span><br><span class="line">    <span class="type">float</span> Set;                 <span class="comment">//定义设定值</span></span><br><span class="line">    <span class="type">float</span> Actual;              <span class="comment">//定义实际值</span></span><br><span class="line">    <span class="type">float</span> Kp,Ki,Kd;            <span class="comment">//定义比例、积分、微分系数</span></span><br><span class="line">    <span class="type">float</span> err;                 <span class="comment">//定义偏差</span></span><br><span class="line">    <span class="type">float</span> err_last;            <span class="comment">//定义上一个偏差</span></span><br><span class="line">    <span class="type">float</span> Sum_err;             <span class="comment">//定义偏差之和</span></span><br><span class="line">    <span class="type">float</span> Proportion;          <span class="comment">//定义输出</span></span><br><span class="line">    <span class="type">float</span> Pout,Iout,Dout;      <span class="comment">//定义个分量输出</span></span><br><span class="line">&#125;PID;</span><br></pre></td></tr></table></figure>
<p>其次，初始化任一PID结构体，并为其动态申请内存。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">PID *<span class="title function_">PID_Init</span><span class="params">(<span class="type">float</span> S, <span class="type">float</span> Kp, <span class="type">float</span> Ki, <span class="type">float</span> Kd)</span></span><br><span class="line">&#123;</span><br><span class="line">    PID *pid_x = <span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(PID));</span><br><span class="line">    pid_x-&gt;Set = S;</span><br><span class="line">    pid_x-&gt;Kp = Kp;</span><br><span class="line">    pid_x-&gt;Ki = Ki;</span><br><span class="line">    pid_x-&gt;Kd = Kd;</span><br><span class="line">    pid_x-&gt;err_last = <span class="number">0</span>;</span><br><span class="line">    pid_x-&gt;Sum_err = <span class="number">0</span>;</span><br><span class="line">    pid_x-&gt;Proportion = <span class="number">0</span>;</span><br><span class="line">    pid_x-&gt;Pout = <span class="number">0</span>;</span><br><span class="line">    pid_x-&gt;Iout = <span class="number">0</span>;</span><br><span class="line">    pid_x-&gt;Dout = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">return</span> pid_x;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>在PID运算过程；</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">PID_Count</span><span class="params">(PID *pid_x, <span class="type">float</span> Act)</span></span><br><span class="line">&#123;</span><br><span class="line">    pid_x-&gt;Actual = Act; <span class="comment">//更新实际值</span></span><br><span class="line">    pid_x-&gt;err_last = pid_x-&gt;err;   <span class="comment">//更新上次偏差</span></span><br><span class="line">    pid_x-&gt;err = pid_x-&gt;Set - pid_x-&gt;Actual; <span class="comment">//更新当前偏差</span></span><br><span class="line">    pid_x-&gt;Pout = pid_x-&gt;Kp * pid_x-&gt;err; <span class="comment">//比例输出</span></span><br><span class="line">    pid_x-&gt;Sum_err += pid_x-&gt;err; <span class="comment">//误差总和   </span></span><br><span class="line">    pid_x-&gt;Iout = (pid_x-&gt;Ki) * (pid_x-&gt;Sum_err);   <span class="comment">//积分输出</span></span><br><span class="line">    pid_x-&gt;Dout = (pid_x-&gt;Kd) * (pid_x-&gt;err - pid_x-&gt;err_last); <span class="comment">//微分输出</span></span><br><span class="line">    pid_x-&gt;Proportion = pid_x-&gt;Pout + pid_x-&gt;Iout + pid_x-&gt;Dout;<span class="comment">//总输出</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>更改PID参数</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">PID_Set_K</span><span class="params">(PID *pid_x, <span class="type">float</span> Kp, <span class="type">float</span> Ki, <span class="type">float</span> Kd)</span> </span><br><span class="line">&#123;</span><br><span class="line">    pid_x-&gt;Kp = Kp;</span><br><span class="line">    pid_x-&gt;Ki = Ki;</span><br><span class="line">    pid_x-&gt;Kd = Kd;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<h2 id="3、硬件设计"><a href="#3、硬件设计" class="headerlink" title="3、硬件设计"></a>3、硬件设计</h2><p>1·主控制器件的论证与选择</p>
<p>方案一：采用传统的51系列单片机</p>
<p>传统的51单片机为8位机，价格便宜，控制简单，但是运算速度慢，片内资源少，存储容量小，难以存储大体积的程序和实现快速精准的反应控制，并且受时钟限制，计时精度不高，外形体积大增加了系统的控制难度。</p>
<p>方案二：采用32位的ARM微控制器</p>
<p>STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器，程序存储器容量是64KB，时钟频率高达72MHZ。</p>
<p>本系统的MCU用于电机控制以及三维角度传感器的信号的采集和处理，对MCU的数据处理和计算要求较高，通过比较，选择方案二。</p>
<p>2·飞行姿态控制的论证与选择</p>
<p>采集模块选择：</p>
<p>方案一：采用MPU-6050模块</p>
<p>MPU-6050六轴模块采用高精度的陀螺仪加速计MPU6050，内部集成了姿态解算器，配合动态卡尔曼滤波算法，能够在动态环境下准确输出模块的当前姿态，姿态测量精度0.01度，稳定性极高。</p>
<p>方案二：采用ADXL345倾角传感器</p>
<p>ADXL345是超低功耗3轴加速度计，分辨率高（13位），数字输出数据为16位二进制补码格式，可通过SPI或I2C数字接口访问。</p>
<p>综合以上两种方案，选择方案一。</p>
<p>3·高度采集模块的论证与选择</p>
<p>方案一：采用的US-100 超声波测距模块可实现 2cm~4.5m 的非接触测距功能，自带温度传感器对测距结果进行校正，同时具有 GPIO，串口等多种通信方式，工作稳定可靠。</p>
<p>方案二：采用MS5611气压传感器，大气压是随高度变化而变化，通过大气压的变化就能转换成高度变化。</p>
<p>方案三：采用激光测距。测量距离远，测量精度高，抗干扰能力强，但体积较大，重量较重，且价格较贵。</p>
<p>考虑到对元器件的熟悉程度，元件的价格以及程序的编写，选择方案一。</p>
<p>4·遥控器模块的论证与选择</p>
<p>方案一：采用蓝牙作为遥控器。蓝牙是一种支持设备短距离通信（最大传输距离100米）的无线电技术。可做到10米左右的准确控制，可以不对准。</p>
<p>方案二：采用红外作为遥控器。红外传输速度快，但传输距离为1~2米，须对准，为单对单传输。</p>
<p>综合以上两种方案，考虑到准确控制飞行器的飞行，选择方案一。</p>
<p>5.电机驱动模块</p>
<p>方案一：298N驱动模块。采用L298N控制芯片。通过单片机改变输入到使能端的电平来控制电机的转速。但飞行器飞行时电机达到的电流远远超过L298N模块所能承受的电流。</p>
<p>方案二：空模无刷马达电子调速器（ESC）。具有强大的耐流能力。具备出色的马达兼容性和很高的驱动效率。最高转速可以达到210000RPM（2极马达），70000 RPM（2极马达），35000（12极马达）.具有普通启动，柔和启动，超柔和启动三种模式，兼容固定飞机及直升机。可设定油门行程，兼容各种遥控器。具备输入电压异常保护，电池低压保护，油门信号丢失保护等多种保护功能。</p>
<p>综合以上两种方案，选择方案二。</p>
<p><img src="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/zhu.png" alt=""></p>
<h2 id=""><a href="#" class="headerlink" title=""></a><img src="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/yao.png" alt=""></h2><h2 id="4、软件设计"><a href="#4、软件设计" class="headerlink" title="4、软件设计"></a>4、软件设计</h2><p>完整代码请访问Github:<a target="_blank" rel="noopener" href="https://github.com/Zwyywz/Electronic-design">https://github.com/Zwyywz/Electronic-design</a></p>
<p><img src="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/image-20210308211127050.png" alt=""></p>
<p><img src="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/image-20210308211152974.png" alt=""></p>
<h2 id="5、测试验收"><a href="#5、测试验收" class="headerlink" title="5、测试验收"></a>5、测试验收</h2><p>基础部分：</p>
<p>（1） 测试基本部分第一项，飞行器能达到A点3秒以上，然后平稳降落到地面，整个过程在15秒以内。说明飞行器能通过PID运算达到指定高度，而且且耗时短。</p>
<p>（2） 测试基本部分第二项，飞行器能达到CD段悬停3秒以上，然后平稳降落到地面，整个过程耗时18秒。说明飞行器能通过PID运算达到指定高度，并且能维持在某个高度，耗时不是很大。</p>
<p>（3） 测试基本部分第三项，飞行器能达到AB段悬停3秒以上，再上升到CD段悬停3秒，再平稳落地。在此过程中，在AB段悬停时黄色LED1#灯亮，在CD段悬停时红色LED2#灯亮。但整个过程耗时35秒，超出了要求。主要原因为PID运算输出的电机油门可能太小，导致上升缓慢。.</p>
<p>（4） 测试基本部分第四项，飞行器达到能CD段的指定高度5秒以上，但是误差超过5cm，上下波动范围不超过5cm,达到要求的同时红灯，黄灯一起亮，主要是因为PID运算的积分作用太大，从而使其超调。</p>
<p>（5） 将控制系统，电池全部安装在横板上，完成上述操作后，双旋翼出现自旋，主要原因没有用舵机来进行对飞行姿态进行调整，从而出现自旋。</p>
<p>发挥部分：</p>
<p>（1） 发挥部分第一项，飞行器能够达到CD段内的100cm处，并且悬停5秒。但稳定需要一定时间，人为拉到BC段内能较快恢复到原来的位置。由此可以分析PID的调节作用还是有的，但开始做PID运算时有点超调，导致悬停稳定时的时间较长。</p>
<p>（2） 发挥部分第二项，在基础部分第四项的基础上，精度的增加还是完成不了。由此可知PID参数的选定还不够合理。</p>
<p>（3） 发挥部分第三项，在完成基础部分第二项的基础上，按下步进键，高度增加了20cm，5秒后平稳降落。基本上完成要求。</p>
<p>（4） 发挥部分第四项，在飞行器上挂上30g的砝码，能完成发挥部分第三项。由此可以得知通过陀螺仪测得Z轴的角度作为PID的反馈，调整两个电机的转速，从而使飞行器达到平衡并且完成相应动作。</p>
<p>（5） 发挥部分第五项为自由发挥，飞行器分别升到A点，B点，C点，然后降到50cm处，然后平缓降落，每个点悬停的时间均为五秒。</p>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="https://gitee.com/zwyywz/zwyywz.git">Zhouwy</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://gitee.com/zwyywz/zwyywz.git/2019/09/07/%E5%8F%8C%E6%97%8B%E7%BF%BC%E9%A3%9E%E8%A1%8C%E5%99%A8/">https://gitee.com/zwyywz/zwyywz.git/2019/09/07/%E5%8F%8C%E6%97%8B%E7%BF%BC%E9%A3%9E%E8%A1%8C%E5%99%A8/</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://gitee.com/zwyywz/zwyywz.git" target="_blank">啊粥啊周舟の部落阁</a>！</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/zwyywz/tags/%E6%99%BA%E8%83%BD%E6%8E%A7%E5%88%B6/">智能控制</a><a class="post-meta__tags" href="/zwyywz/tags/STM32/">STM32</a></div><div class="post_share"><div class="social-share" data-image="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/下载.jpg" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/css/share.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/js/social-share.min.js" defer></script></div></div><div class="post-reward"><div class="reward-button"><i class="fas fa-qrcode"></i> 打赏</div><div class="reward-main"><ul class="reward-all"><li class="reward-item"><a href="/zwyywz/img/wechat.jpg" target="_blank"><img class="post-qr-code-img" src="/zwyywz/img/wechat.jpg" alt="微信"/></a><div class="post-qr-code-desc">微信</div></li><li class="reward-item"><a href="/zwyywz/img/alipay.jpg" target="_blank"><img class="post-qr-code-img" src="/zwyywz/img/alipay.jpg" alt="支付宝"/></a><div class="post-qr-code-desc">支付宝</div></li></ul></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/zwyywz/2020/03/31/MathematicaOfMachineLearning/" title="机器学习中的数学原理"><img class="cover" src="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/maths.jpg" onerror="onerror=null;src='/zwyywz/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">机器学习中的数学原理</div></div></a></div><div class="next-post pull-right"><a href="/zwyywz/2019/09/07/%E6%A0%91%E8%8E%93%E6%B4%BE%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/" title="树莓派搭建 【优雅の博客】"><img class="cover" src="https://blog-1300216920.cos.ap-nanjing.myqcloud.com/Raspberry_Pi_4.jpg" onerror="onerror=null;src='/zwyywz/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">树莓派搭建 【优雅の博客】</div></div></a></div></nav></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span><span class="toc-percentage"></span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%8D%87%E9%99%8D%E5%BC%8F%E5%8F%8C%E6%97%8B%E7%BF%BC%E9%A3%9E%E8%A1%8C%E5%99%A8"><span class="toc-number">1.</span> <span class="toc-text">升降式双旋翼飞行器</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#1%E3%80%81%E8%B5%9B%E9%A2%98%E7%AE%80%E4%BB%8B"><span class="toc-number">1.1.</span> <span class="toc-text">1、赛题简介</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-1%E3%80%81%E8%B5%9B%E9%A2%98%E4%BB%BB%E5%8A%A1"><span class="toc-number">1.1.1.</span> <span class="toc-text">1.1、赛题任务</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#1-2%E3%80%81%E5%9F%BA%E6%9C%AC%E8%A6%81%E6%B1%82"><span class="toc-number">1.1.2.</span> <span class="toc-text">1.2、基本要求</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#1-3%E3%80%81%E5%8F%91%E6%8C%A5%E9%83%A8%E5%88%86"><span class="toc-number">1.1.3.</span> <span class="toc-text">1.3、发挥部分</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2%E3%80%81%E5%8E%9F%E7%90%86%E8%AE%BA%E8%AF%81"><span class="toc-number">1.2.</span> <span class="toc-text">2、原理论证</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3%E3%80%81%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1"><span class="toc-number">1.3.</span> <span class="toc-text">3、硬件设计</span></a></li><li class="toc-item toc-level-2"><a class="toc-link"><span class="toc-number">1.4.</span> <span class="toc-text"></span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#4%E3%80%81%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1"><span class="toc-number">1.5.</span> <span class="toc-text">4、软件设计</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5%E3%80%81%E6%B5%8B%E8%AF%95%E9%AA%8C%E6%94%B6"><span class="toc-number">1.6.</span> <span class="toc-text">5、测试验收</span></a></li></ol></li></ol></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2020 - 2023 By Zhouwy</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="translateLink" type="button" title="简繁转换">简</button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/zwyywz/js/utils.js"></script><script src="/zwyywz/js/main.js"></script><script src="/zwyywz/js/tw_cn.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox/fancybox.umd.min.js"></script><div class="js-pjax"><script>if (!window.MathJax) {
  window.MathJax = {
    tex: {
      inlineMath: [ ['$','$'], ["\\(","\\)"]],
      tags: 'ams'
    },
    chtml: {
      scale: 1.1
    },
    options: {
      renderActions: {
        findScript: [10, doc => {
          for (const node of document.querySelectorAll('script[type^="math/tex"]')) {
            const display = !!node.type.match(/; *mode=display/)
            const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display)
            const text = document.createTextNode('')
            node.parentNode.replaceChild(text, node)
            math.start = {node: text, delim: '', n: 0}
            math.end = {node: text, delim: '', n: 0}
            doc.math.push(math)
          }
        }, ''],
        insertScript: [200, () => {
          document.querySelectorAll('mjx-container').forEach(node => {
            if (node.hasAttribute('display')) {
              btf.wrap(node, 'div', { class: 'mathjax-overflow' })
            } else {
              btf.wrap(node, 'span', { class: 'mathjax-overflow' })
            }
          });
        }, '', false]
      }
    }
  }
  
  const script = document.createElement('script')
  script.src = 'https://cdn.jsdelivr.net/npm/mathjax/es5/tex-mml-chtml.min.js'
  script.id = 'MathJax-script'
  script.async = true
  document.head.appendChild(script)
} else {
  MathJax.startup.document.state(0)
  MathJax.texReset()
  MathJax.typesetPromise()
}</script></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>